package com.stt.videoprocess.design.state.impl;

import com.stt.videoprocess.design.model.VideoTask;
import com.stt.videoprocess.design.state.VideoProcessingState;
import lombok.extern.slf4j.Slf4j;

/**
 * 失败状态实现类
 * 1. 当任务处理失败时进入此状态
 * 2. 在此状态下，任务无法进行任何其他操作（如开始、暂停、恢复、完成等）
 */
@Slf4j
public class FailedState implements VideoProcessingState {

    /**
     * 处理视频任务的方法。
     * 记录日志信息，表明任务处理失败。
     *
     * @param task 视频任务对象，包含任务的相关信息
     */
    @Override
    public void handle(VideoTask task) {
        log.error("任务处理失败: {}", task.getTaskId());
    }

    /**
     * 尝试从失败状态开始处理视频任务。
     * 抛出异常，因为任务已经失败，无法重新开始处理。
     *
     * @param task 视频任务对象，包含任务的相关信息
     * @return 返回新的处理状态对象（此方法不会返回，直接抛出异常）
     * @throws IllegalStateException 如果尝试从失败状态开始处理，抛出此异常
     */
    @Override
    public VideoProcessingState startProcessing(VideoTask task) {
        throw new IllegalStateException("无法从失败状态开始处理");
    }

    /**
     * 尝试从失败状态暂停视频任务处理。
     * 抛出异常，因为任务已经失败，无法暂停。
     *
     * @param task 视频任务对象，包含任务的相关信息
     * @return 返回新的处理状态对象（此方法不会返回，直接抛出异常）
     * @throws IllegalStateException 如果尝试从失败状态暂停处理，抛出此异常
     */
    @Override
    public VideoProcessingState pauseProcessing(VideoTask task) {
        throw new IllegalStateException("无法从失败状态暂停");
    }

    /**
     * 尝试从失败状态恢复视频任务处理。
     * 抛出异常，因为任务已经失败，无法恢复处理。
     *
     * @param task 视频任务对象，包含任务的相关信息
     * @return 返回新的处理状态对象（此方法不会返回，直接抛出异常）
     * @throws IllegalStateException 如果尝试从失败状态恢复处理，抛出此异常
     */
    @Override
    public VideoProcessingState resumeProcessing(VideoTask task) {
        throw new IllegalStateException("无法从失败状态恢复");
    }

    /**
     * 尝试从失败状态完成视频任务处理。
     * 抛出异常，因为任务已经失败，无法完成处理。
     *
     * @param task 视频任务对象，包含任务的相关信息
     * @return 返回新的处理状态对象（此方法不会返回，直接抛出异常）
     * @throws IllegalStateException 如果尝试从失败状态完成处理，抛出此异常
     */
    @Override
    public VideoProcessingState completeProcessing(VideoTask task) {
        throw new IllegalStateException("无法从失败状态完成");
    }

    /**
     * 尝试再次标记任务为失败。
     * 抛出异常，因为任务已经处于失败状态，无需重复标记。
     *
     * @param task        视频任务对象，包含任务的相关信息
     * @param errorMessage 错误信息，描述任务失败的原因
     * @return 返回新的处理状态对象（此方法不会返回，直接抛出异常）
     * @throws IllegalStateException 如果任务已经失败，抛出此异常
     */
    @Override
    public VideoProcessingState failProcessing(VideoTask task, String errorMessage) {
        throw new IllegalStateException("任务已处于失败状态");
    }
}
